# 闭包是什么？
"""
在一个外函数中定义了一个内嵌函数，内嵌函数里运用了外函数的临时变量。
并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

一般情况下，在我们认知当中，如果一个函数结束，函数的内部所有东西都会释放掉。
还给内存，局部变量都会消失。但是闭包是一种特殊情况，如果外函数在结束的时候
发现有自己的临时变量将会在内部函数中用到，就把这个临时变量绑定给了内部函数，
然后自己再结束。


闭包的三个缺一不可的条件：
1. 必须有一个内嵌函数（函数里定义的函数）——这对应函数之间的嵌套
2. 内嵌函数必须引用一个定义在闭合范围内（外部函数里）的变量——内部函数引用外部变量
3. 外部函数必须返回内嵌函数——必须返回那个内部函数

"""



"""
闭包的优点和作用：
1. 闭包优化了变量，原来需要类对象完成的工作，闭包也可以完成；
2. 装饰器就是一种闭包，装饰器有的功能，闭包也有；
3. 闭包可以实现单例模式和工厂模式；
4. 当闭包执行完成后，仍然能够保持住当前的运行环境，以便下次调用；


闭包的缺点：
1. 每次调用函数时，都得在全局作用域声明变量。别人调用函数时，还得查看函数内部代码
2. 当函数在多个地方被调用并且同时记录着很多状态时，会造成非常多的混乱
3. 由于闭包引用了外部函数的局部变量，则外部函数的局部变量没有及时释放，消耗内存
"""
